package com.rabbit.config;

import java.util.HashMap;
import java.util.Map;
import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.DirectExchange;
import org.springframework.amqp.core.Queue;
import org.springframework.amqp.core.QueueBuilder;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class TtlQueueConfig {
public static final String X_EXCHANGE="X";
public static final String QUEUE_A = "QA";
public static final String QUEUE_B ="QB";
public static final String Y_DEAD_LETTER_EXCHANGE= "Y";
public static final String DEAD_LETTER_QUEUE="QD";

@Bean("xExchange")
  public DirectExchange xExchange(){
  return new DirectExchange(X_EXCHANGE);
}

@Bean("yExchange")
  public DirectExchange yExchange(){
  return new DirectExchange(Y_DEAD_LETTER_EXCHANGE);
}
@Bean("queueA")
  public Queue queueA(){
  Map<String,Object> args=new HashMap<>(3);
  //声明当前队列绑定的死信交换机
  args.put("x-dead-letter-exchange",Y_DEAD_LETTER_EXCHANGE);
  //声明当前队列的死信路由key
  args.put("x-dead-letter-routing-key","YD");
  //声明队列的TTL
  args.put("x-message-ttl",10000);
  return QueueBuilder.durable(QUEUE_A).withArguments(args).build();
}
//声明队列A绑定X交换机
  @Bean
  public Binding queueaBindingX(@Qualifier("queueA")Queue queueA,
      @Qualifier("xExchange")DirectExchange xExchange){

  return BindingBuilder.bind(queueA).to(xExchange).with("XA");

  }

  //声明队列B ttl为40s 并绑定到对应的死信交换机
  @Bean("queueB")
  public Queue queueB(){
  Map<String,Object> args=new HashMap<>(3);
    //声明当前队列绑定的死信交换机
    args.put("x-dead-letter-exchange", Y_DEAD_LETTER_EXCHANGE);
//声明当前队列的死信路由 key
    args.put("x-dead-letter-routing-key", "YD");
//声明队列的 TTL
    args.put("x-message-ttl", 40000);
    return QueueBuilder.durable(QUEUE_B).withArguments(args).build();
  }
  //声明队列 B 绑定 X 交换机
  @Bean
  public Binding queuebBindingX(@Qualifier("queueB") Queue queue1B,
      @Qualifier("xExchange") DirectExchange xExchange){
    return BindingBuilder.bind(queue1B).to(xExchange).with("XB");
  }
  //声明死信队列 QD
  @Bean("queueD")
  public Queue queueD(){
    return new Queue(DEAD_LETTER_QUEUE);
  }
  //声明死信队列 QD 绑定关系
  @Bean
  public Binding deadLetterBindingQAD(@Qualifier("queueD") Queue queueD,
      @Qualifier("yExchange") DirectExchange yExchange){
    return BindingBuilder.bind(queueD).to(yExchange).with("YD");
  }

}
